/*
 * Copyright (C), 2012-2020, com.net
 * FileName: DateUtils.java
 * Author:   wangkai
 * Date:     2012-05-01
 * Description: //模块目的、功能描述      
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.zxy.health.utils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * 日期工具类
 */
public class DateUtils {

	public final static String yyyy = "yyyy";

	public final static String MM = "MM";

	public final static String dd = "dd";

	public final static String yyyy_MM_dd = "yyyy-MM-dd";

	public final static String yyyy_MM_dd_CH = "yyyy年MM月dd日";

	public final static String yyyyMMdd = "yyyyMMdd";

	public final static String yyyy_MM = "yyyy-MM";

	public final static String yyyyMM = "yyyyMM";

	public final static String HH_mm_ss = "HH:mm:ss";

	public final static String HH_mm = "HH:mm";

	public final static String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";

	public final static String yyyyMMdd_HH_mm_ss = "yyyyMMdd HH:mm:ss";

	public final static String yyyyMMddHHmmss = "yyyyMMddHHmmss";

	public final static String yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";

	public final static String yyyyMMddHHmm = "yyyyMMddHHmm";

	public final static String yyyy_MM_dd_HH_mm_ss_SSS = "yyyy-MM-dd HH:mm:ss.SSS";

	public final static String yyyyMMddHHmmssSSS = "yyyyMMddHHmmssSSS";
	
	public final static String yyMMdd = "yyMMdd";

	/**
	 * 默认为yyyy-MM-dd的格式化
	 * 
	 * @param date
	 * @return
	 */
	public static String format(Date date) {
		return format(date, yyyy_MM_dd);
	}

	/**
	 * 得到yyyy年MM月dd日的格式化字符串
	 * 
	 * @param date
	 * @return
	 */
	public static String formatCH(Date date) {
		return format(date, yyyy_MM_dd_CH);
	}

	/**
	 * 得到yyyy年MM月dd日的格式化字符串
	 *
	 * @return
	 */
	public static String getCurrentCH() {

		return formatCH(getCurrDate());
	}




	/**
	 * 获取一个简单的日期格式化对象
	 * 
	 * @return 一个简单的日期格式化对象
	 */
	private static SimpleDateFormat getFormatter(String parttern) {
		return new SimpleDateFormat(parttern);
	}

	/**
	 * 日期格式化－将<code>Date</code>类型的日期格式化为<code>String</code>型
	 * 
	 * @param date
	 *            待格式化的日期
	 * @param pattern
	 *            时间样式
	 * @return 一个被格式化了的<code>String</code>日期
	 */
	public static String format(Date date, String pattern) {
		if (date == null) {
			return "";
		} else {
			return getFormatter(pattern).format(date);
		}
	}

	/**
	 * 默认为yyyy-MM-dd格式的解析
	 * 
	 * @param strDate
	 * @return
	 */
	public static Date parse(String strDate) throws ParseException{
		return parse(strDate, yyyy_MM_dd);
	}

	/**
	 * 日期解析－将<code>String</code>类型的日期解析为<code>Date</code>型
	 * 
	 * @param strDate
	 *            待解析的日期字符串
	 * @param pattern
	 *            日期格式
	 * @ExceptionHandler ParseException 如果所给的字符串不能被解析成一个日期
	 * @return 一个被格式化了的<code>Date</code>日期
	 */
	public static Date parse(String strDate, String pattern)  throws ParseException{
		return getFormatter(pattern).parse(strDate);
	}
	
	/**
	 * 日期解析－将<code>String</code>类型的日期解析为<code>Date</code>型
	 * 
	 * @param strDate
	 *            待解析的日期字符串
	 * @param pattern
	 *            日期格式
	 * @ExceptionHandler ParseException 如果所给的字符串不能被解析成一个日期
	 * @return 一个被格式化了的<code>Date</code>日期
	 */
	public static Date parse2(String strDate, String pattern) {
		try {
			return getFormatter(pattern).parse(strDate);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 获取日期(java.util.Date)
	 * 
	 * @return
	 */
	public static Date getCurrDate() {
		Calendar calendar = Calendar.getInstance();
		return calendar.getTime();
	}

	/**
	 * 
	 * 功能描述: <br>
	 * 获取当天，从0点起算
	 * 
	 * @return
	 * @see [相关类/方法](可选)
	 * @since [产品/模块版本](可选)
	 */
	public static Date getCurrDay() throws ParseException{
		Date currentDate = getCurrDate();
		return parse(format(currentDate));
	}

	/**
	 * 获取指定毫秒数所表示的日期
	 * 
	 * @param millis
	 *            millis the new time in UTC milliseconds from the epoch.
	 * @return
	 */
	public static Date getDate(long millis) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(millis);
		return calendar.getTime();
	}

	/**
	 * 获取当前日期字符串
	 * 格式：yyyy-MM-dd
	 * @return 一个包含年月日<code>String</code>型日期，yyyy-MM-dd
	 */
	public static String getCurrDateStr() {
		return format(getCurrDate(), yyyy_MM_dd);
	}
	
	/**
	 * 获取当前日期字符串
	 * 格式：yyMMdd
	 * @return
	 */
	public static String getSimpleCurrDateStr() {
		return format(getCurrDate(), yyMMdd);
	}
	
	
	/**
	 * 获取当前日期字符串
	 * 格式：yyyy-MM-dd
	 * @return 一个包含年月日<code>String</code>型日期，yyyy-MM-dd
	 */
	public static String getCurrDateStrYMD() {
		return format(getCurrDate(), yyyyMMdd);
	}

	/**
	 * 获取当前日期时间字符串，格式: yyyy-MM-dd HH:mm:ss
	 * 
	 * @return 一个包含年月日时分秒的<code>String</code>型日期时间字符串，格式：yyyy-MM-dd HH:mm:ss
	 */
	public static String getCurrDateTimeStr() {
		return format(getCurrDate(), yyyy_MM_dd_HH_mm_ss);
	}
	/**
	 * @return yyyyMMddHHmmssSSS 格式时间
	 * */
	public static String getCurrDateTimeMillsStr() {
		return format(getCurrDate(), yyyyMMddHHmmssSSS);
	}

	/**
	 * 获取指定毫秒数所表示的日期时间字符串，样式: yyyy-MM-dd HH:mm:ss
	 * 
	 * @param millis
	 *            millis the new time in UTC milliseconds from the epoch.
	 * @return 一个包含年月日时分秒的<code>String</code>型日期时间字符串，格式：yyyy-MM-dd HH:mm:ss
	 */
	public static String getDateTimeStr(long millis) {
		return format(getDate(millis), yyyy_MM_dd_HH_mm_ss);
	}

	/**
	 * 获取当前年分 样式：yyyy
	 * 
	 * @return 当前年分
	 */
	public static String getYear() {
		return format(getCurrDate(), yyyy);
	}

	/**
	 * 获取当前月分 样式：MM
	 * 
	 * @return 当前月分
	 */
	public static String getMonth() {
		return format(getCurrDate(), MM);
	}


	/**
	 * 获取当前日期号 样式：dd
	 * 
	 * @return 当前日期号
	 */
	public static String getCurrentDay() {
		return format(getCurrDate(), dd);
	}




	/**
	 * 获取当前日期所在月的第一天
	 * 
	 * @return
	 */
	public static Date getFirstDayOfMonth() {
		return getFirstDayOfMonth(getCurrDate());
	}

	/**
	 * 获取指定日期所在月的第一天
	 * 
	 * @param date 指定的日期
	 * @return
	 */
	public static Date getFirstDayOfMonth(Date date) {

		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.set(Calendar.DATE, 1);// 设为当前月的第一天
		return c.getTime();

	}

	/**
	 * 获取当前日期所在月的最后一天
	 * 
	 * @return
	 */
	public static Date getLastDayOfMonth() {
		return getLastDayOfMonth(getCurrDate());
	}

	/**
	 * 获取指定日期所在月的最后一天
	 * 
	 * @param date
	 *            日期
	 * @return
	 */
	public static Date getLastDayOfMonth(Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 1);// 当前月加1变为下一个月
		c.set(Calendar.DATE, 1);// 设为下一个月的第一天
		c.add(Calendar.DATE, -1);// 减一天，变为本月最后一天
		return c.getTime();
	}


	/**
	 * 以友好的方式显示过去的时间
	 * 
	 * @param date
	 *            日期
	 * @return
	 */
	public static String friendlyTime(Date date) {
		// 计算时间差，单位：秒
		int ct = (int) ((System.currentTimeMillis() - date.getTime()) / 1000);
		if (ct < 3600) {
			return String.format("%d 分钟之前", ct / 60);
		}
		if (ct >= 3600 && ct < 86400) {
			return String.format("%d 小时之前", ct / 3600);
		}
		if (ct >= 86400 && ct < 2592000) { // 86400 * 30
			int day = ct / 86400;
			if (day > 1) {
				return String.format("%d 天之前", day);
			} else {
				return "昨天";
			}
		}
		if (ct >= 2592000 && ct < 31104000) { // 86400 * 30
			return String.format("%d 月之前", ct / 2592000);
		}

		return String.format("%d 年之前", ct / 31104000);

	}

	/**
	 * 以友好的方式显示经历过的时间
	 * 
	 * @param seconds
	 *            经历过的时间(耗时)，单位：秒
	 * @return
	 */
	public static String friendlyTime(long seconds) {
		// X天Y时Z分钟
		int day = (int) (seconds / 86400);
		int hour = (int) ((seconds - day * 86400) / 3600);
		int minute = (int) ((seconds - day * 86400 - hour * 3600) / 60);

		if (day == 0 && hour == 0 && minute == 0) {
			return seconds + "秒";
		} else if (day == 0 && hour == 0) {
			return minute + "分";
		} else if (day == 0) {
			return hour + "时" + minute + "分";
		} else {
			return day + "天" + hour + "时" + minute + "分";
		}
	}

	/**
	 * 
	 * 获取当前时间戳 <br>
	 * 〈功能详细描述〉
	 * 
	 * @return
	 * @see [相关类/方法](可选)
	 * @since [产品/模块版本](可选)
	 */
	public static Timestamp getCurrTimeStamp() {
		return new Timestamp(new Date().getTime());
	}

	/**
	 * 
	 * 返回日期对应的Timestamp <br>
	 * 〈功能详细描述〉
	 * 
	 * @param dateTime
	 * @return
	 * @see [相关类/方法](可选)
	 * @since [产品/模块版本](可选)
	 */
	public static Timestamp getTimeStamp(Date dateTime) {
		return new Timestamp(dateTime.getTime());
	}


	/**
	 * 获取指定日期下一天
	 */
	public static Date getNextDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_YEAR, 1);
		date = calendar.getTime();
		return date;
	}


}
